From 0107859d41f0bfba98025a1109a8bb2e47ba6265 Mon Sep 17 00:00:00 2001 From: Alexandre Emsenhuber Date: Fri, 30 Dec 2011 20:43:08 +0000 Subject: [PATCH] * Inverted the precedence between section edition and revision undoing, now undo and undoafter will be ignored if the section (or even wpSection) is provided to be consistent the remaining of the interface * Modified EditPage::getContent() to load the original content only when really needed * Don't put the 'missing-article' in the textbox when a non-existing revision is provided, instead display it above the form * Always diff to the current version when showing a conflict or a spam filter match * Factorised code to get the current text on edit conflict * Compare the correct text in EditPage::internalAttemptSave() * Some little coding style fixes --- includes/EditPage.php | 196 +++++++++++++++++++++++++----------------- 1 file changed, 118 insertions(+), 78 deletions(-) diff --git a/includes/EditPage.php b/includes/EditPage.php index 5c6c3829e5..dad5afcc35 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -694,91 +694,84 @@ class EditPage { global $wgOut, $wgRequest, $wgParser; wfProfileIn( __METHOD__ ); - # Get variables from query string :P - $section = $wgRequest->getVal( 'section' ); - $preload = $wgRequest->getVal( 'preload', - // Custom preload text for new sections - $section === 'new' ? 'MediaWiki:addsection-preload' : '' ); - $undoafter = $wgRequest->getVal( 'undoafter' ); - $undo = $wgRequest->getVal( 'undo' ); + $text = false; // For message page not locally set, use the i18n message. // For other non-existent articles, use preload text if any. - if ( !$this->mTitle->exists() ) { - if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) { + if ( !$this->mTitle->exists() || $section == 'new' ) { + if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && $section != 'new' ) { # If this is a system message, get the default text. $text = $this->mTitle->getDefaultMessageText(); - if( $text === false ) { - $text = $this->getPreloadedText( $preload ); - } - } else { + } + if ( $text === false ) { # If requested, preload some text. + $preload = $wgRequest->getVal( 'preload', + // Custom preload text for new sections + $this->section === 'new' ? 'MediaWiki:addsection-preload' : '' ); $text = $this->getPreloadedText( $preload ); } // For existing pages, get text based on "undo" or section parameters. } else { - $text = $this->mArticle->getContent(); - if ( $undo > 0 && $undoafter > 0 && $undo < $undoafter ) { - # If they got undoafter and undo round the wrong way, switch them - list( $undo, $undoafter ) = array( $undoafter, $undo ); - } - if ( $undo > 0 && $undo > $undoafter ) { - # Undoing a specific edit overrides section editing; section-editing - # doesn't work with undoing. - if ( $undoafter ) { + if ( $this->section != '' ) { + // Get section edit text (returns $def_text for invalid sections) + $text = $wgParser->getSection( $this->getOriginalContent(), $this->section, $def_text ); + } else { + $undoafter = $wgRequest->getInt( 'undoafter' ); + $undo = $wgRequest->getInt( 'undo' ); + + if ( $undo > 0 && $undoafter > 0 ) { + if ( $undo < $undoafter ) { + # If they got undoafter and undo round the wrong way, switch them + list( $undo, $undoafter ) = array( $undoafter, $undo ); + } + $undorev = Revision::newFromId( $undo ); $oldrev = Revision::newFromId( $undoafter ); - } else { - $undorev = Revision::newFromId( $undo ); - $oldrev = $undorev ? $undorev->getPrevious() : null; - } - # Sanity check, make sure it's the right page, - # the revisions exist and they were not deleted. - # Otherwise, $text will be left as-is. - if ( !is_null( $undorev ) && !is_null( $oldrev ) && - $undorev->getPage() == $oldrev->getPage() && - $undorev->getPage() == $this->mTitle->getArticleId() && - !$undorev->isDeleted( Revision::DELETED_TEXT ) && - !$oldrev->isDeleted( Revision::DELETED_TEXT ) ) { - - $undotext = $this->mArticle->getUndoText( $undorev, $oldrev ); - if ( $undotext === false ) { - # Warn the user that something went wrong - $this->editFormPageTop .= $wgOut->parse( '
' . - wfMsgNoTrans( 'undo-failure' ) . '
', true, /* interface */true ); - } else { - $text = $undotext; - # Inform the user of our success and set an automatic edit summary - $this->editFormPageTop .= $wgOut->parse( '
' . - wfMsgNoTrans( 'undo-success' ) . '
', true, /* interface */true ); - $firstrev = $oldrev->getNext(); - # If we just undid one rev, use an autosummary - if ( $firstrev->getId() == $undo ) { - $undoSummary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() ); - if ( $this->summary === '' ) { - $this->summary = $undoSummary; - } else { - $this->summary = $undoSummary . wfMsgForContent( 'colon-separator' ) . $this->summary; + # Sanity check, make sure it's the right page, + # the revisions exist and they were not deleted. + # Otherwise, $text will be left as-is. + if ( !is_null( $undorev ) && !is_null( $oldrev ) && + $undorev->getPage() == $oldrev->getPage() && + $undorev->getPage() == $this->mTitle->getArticleId() && + !$undorev->isDeleted( Revision::DELETED_TEXT ) && + !$oldrev->isDeleted( Revision::DELETED_TEXT ) ) { + + $text = $this->mArticle->getUndoText( $undorev, $oldrev ); + if ( $text === false ) { + # Warn the user that something went wrong + $undoMsg = 'failure'; + } else { + # Inform the user of our success and set an automatic edit summary + $undoMsg = 'success'; + + # If we just undid one rev, use an autosummary + $firstrev = $oldrev->getNext(); + if ( $firstrev->getId() == $undo ) { + $undoSummary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() ); + if ( $this->summary === '' ) { + $this->summary = $undoSummary; + } else { + $this->summary = $undoSummary . wfMsgForContent( 'colon-separator' ) . $this->summary; + } + $this->undidRev = $undo; } - $this->undidRev = $undo; + $this->formtype = 'diff'; } - $this->formtype = 'diff'; + } else { + // Failed basic sanity checks. + // Older revisions may have been removed since the link + // was created, or we may simply have got bogus input. + $undoMsg = 'norev'; } - } else { - // Failed basic sanity checks. - // Older revisions may have been removed since the link - // was created, or we may simply have got bogus input. - $this->editFormPageTop .= $wgOut->parse( '
' . - wfMsgNoTrans( 'undo-norev' ) . '
', true, /* interface */true ); + + $this->editFormPageTop .= $wgOut->parse( "
" . + wfMsgNoTrans( 'undo-' . $undoMsg ) . '
', true, /* interface */true ); } - } elseif ( $section != '' ) { - if ( $section == 'new' ) { - $text = $this->getPreloadedText( $preload ); - } else { - // Get section edit text (returns $def_text for invalid sections) - $text = $wgParser->getSection( $text, $section, $def_text ); + + if ( $text === false ) { + $text = $this->getOriginalContent(); } } } @@ -787,6 +780,48 @@ class EditPage { return $text; } + /** + * Get the content of the wanted revision, without section extraction. + * + * The result of this function can be used to compare user's input with + * section replaced in its context (using WikiPage::replaceSection()) + * to the original text of the edit. + * + * This difers from Article::getContent() that when a missing revision is + * encountered the result will be an empty string and not the + * 'missing-article' message. + * + * @since 1.19 + * @return string + */ + private function getOriginalContent() { + if ( $this->section == 'new' ) { + return $this->getCurrentText(); + } + $revision = $this->mArticle->getRevisionFetched(); + if ( $revision === null ) { + return ''; + } + return $this->mArticle->getContent(); + } + + /** + * Get the actual text of the page. This is basically similar to + * WikiPage::getRawText() except that when the page doesn't exist an empty + * string is returned instead of false. + * + * @since 1.19 + * @return string + */ + private function getCurrentText() { + $text = $this->mArticle->getRawText(); + if ( $text === false ) { + return ''; + } else { + return $text; + } + } + /** * Use this method before edit() to preload some text into the edit box * @@ -1245,7 +1280,7 @@ class EditPage { # Handle the user preference to force summaries here, but not for null edits if ( $this->section != 'new' && !$this->allowBlankSummary - && 0 != strcmp( $this->mArticle->getContent(), $text ) + && $this->getOriginalContent() != $text && !Title::newFromRedirect( $text ) ) # check if it's not a redirect { if ( md5( $this->summary ) == $this->autoSumm ) { @@ -1721,7 +1756,10 @@ HTML // and fallback to the raw wpTextbox1 since editconflicts can't be // resolved between page source edits and custom ui edits using the // custom edit ui. - $this->showTextbox1( null, $this->getContent() ); + $this->textbox2 = $this->textbox1; + $this->textbox1 = $this->getCurrentText(); + + $this->showTextbox1(); } else { $this->showContentForm(); } @@ -1750,8 +1788,9 @@ HTML HTML ); - if ( $this->isConflict ) + if ( $this->isConflict ) { $this->showConflict(); + } $wgOut->addHTML( $this->editFormTextBottom ); $wgOut->addHTML( "\n" ); @@ -1837,6 +1876,12 @@ HTML $this->mArticle->setOldSubtitle( $revision->getId() ); $wgOut->addWikiMsg( 'editingold' ); } + } else { + // Something went wrong + + $wgOut->wrapWikiMsg( "
\n$1\n
\n", + array( 'missing-article', $this->mTitle->getPrefixedText(), + wfMsgNoTrans( 'missingarticle-rev', $this->oldid ) ) ); } } } @@ -2167,11 +2212,7 @@ HTML function showDiff() { global $wgUser, $wgContLang, $wgParser, $wgOut; - if ( $this->section == 'new' ) { - $oldtext = $this->mArticle->getRawText(); - } else { - $oldtext = $this->mArticle->fetchContent(); - } + $oldtext = $this->getOriginalContent(); $newtext = $this->mArticle->replaceSection( $this->section, $this->textbox1, $this->summary, $this->edittime ); @@ -2271,8 +2312,7 @@ HTML */ protected function showConflict() { global $wgOut; - $this->textbox2 = $this->textbox1; - $this->textbox1 = $this->getContent(); + if ( wfRunHooks( 'EditPageBeforeConflictDiff', array( &$this, &$wgOut ) ) ) { $wgOut->wrapWikiMsg( '

$1

', "yourdiff" ); @@ -2895,7 +2935,7 @@ HTML $wgOut->wrapWikiMsg( '

$1

', "yourdiff" ); $de = new DifferenceEngine( $this->mArticle->getContext() ); - $de->setText( $this->getContent(), $this->textbox2 ); + $de->setText( $this->getCurrentText(), $this->textbox2 ); $de->showDiff( wfMsg( "storedversion" ), wfMsgExt( 'yourtext', 'parseinline' ) ); $wgOut->wrapWikiMsg( '

$1

', "yourtext" ); -- 2.20.1